Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
En este ejemplo voy a describir la estructura del archivo que utilizo para cargar el modelo 3D. Este archivo es una version simplificada de los archivos .asc, exportados por 3DStudio.
El formato que voy a utilizar es muy simple, en la primer linea indico el
numero de vertices que tiene el modelo:
Vertices: 6
despues estan los valores de las coordenadas X, Y, Z de cada uno de los vertices,
se encuentran separados por un espacio, en mi ejemplo estan indexados del 0 al 5,
ya que tengo 6 vertices:
0.0 10.0 0.0 0 -5.0 0.0 5.0 1 5.0 0.0 5.0 2 5.0 0.0 -5.0 3 -5.0 0.0 -5.0 4 0.0 0.0 0.0 5
la siguiente linea me indica el numero de poligonos o caras que tiene el modelo:
Faces: 8
cada poligono esta formado por 3 vertices, yo solo indico el indice del
vertice correspondiente, el material que tiene aplicado, y luego a que grupo
de suavizado pertenece:
0 1 2 indice de los vertices que forman esta cara MaterialID: 0 este valor me indica que material tiene aplicado Smoothing: 2 el grupo de suavisado al que pertenece
lo anterior es solo para la primer cara del modelo 3D, la del frente que esta
en color verde en la imagen, las restantes se definen de igual manera, el modelo
tiene 3 materiales (colores), diferentes y 3 grupos de suavizado.
las caras 0, 2 tiene aplicado el material con indice 0, y el grupo de smooth 2
las caras 1, 3 tienen el material con indice 1, y el grupo de smooth 1
las carss 4,5,6,7 tiene el material con indice 2, y el grupo de smooth 3
Uuicación del modelo 3D en el espacio |
este es el archivo completo piramide.dat
Vertices: 6 0.0 10.0 0.0 -5.0 0.0 5.0 5.0 0.0 5.0 5.0 0.0 -5.0 -5.0 0.0 -5.0 0.0 0.0 0.0 Faces: 8 0 1 2 MaterialID: 0 Smoothing: 2 0 2 3 MaterialID: 1 Smoothing: 1 0 3 4 MaterialID: 0 Smoothing: 2 0 4 1 MaterialID: 1 Smoothing: 1 1 5 2 MaterialID: 2 Smoothing: 3 2 5 3 MaterialID: 2 Smoothing: 3 3 5 4 MaterialID: 2 Smoothing: 3 4 5 1 MaterialID: 2 Smoothing: 3 |
Dos vista del modelo
Rutina que se encarga de abrir, leer y almacenar todos los datos del modelo 3D en la estructura de datos que utilizo para representarlo.
El codigo fuente y el archivo del modelo y el material : ejemplo2.zip
el ejecutable : ejemplo4exe.zip
void CargarModelo(char *filename, Object3D &object) { FILE *file; char *tempString = new char [80]; char trash[15]; float tempX, tempY, tempZ; int tempA, tempB, tempC; int indexMaterial, indexSmoothing; int i; if((file = fopen(filename, "rt"))==NULL) { printf("File Not Found : %s\n",filename); exit(1); } while(strncmp(tempString, "Vertices",8)) { fscanf(file, "%s", tempString); if (feof(file)) { printf("String \"Vertices\" no existe\n"); exit(1); } } fgetc(file); fscanf(file, "%d", &object.nVertices); object.pVertices = new Point3f[object.nVertices]; for (i=0; i<object.nVertices; i++) { fscanf(file, "%f %f %f\n", &tempX, &tempY, &tempZ); object.pVertices[i].x=tempX; object.pVertices[i].y=tempY; object.pVertices[i].z=tempZ; } while(strncmp(tempString, "Faces",5)) { fscanf(file, "%s", tempString); if (feof(file)) { printf("String \"Faces\" no existe\n"); exit(1); } } fgetc(file); fscanf(file, "%d", &object.nFaces); object.pFaces = new Face[object.nFaces]; for (i=0; i<object.nFaces; i++) { fscanf(file, "%d %d %d\n", &tempA, &tempB, &tempC); fscanf(file, "%s %d\n", &trash, &indexMaterial); fscanf(file, "%s %d\n", &trash, &indexSmoothing); object.pFaces[i].vertexIndices[0]=tempA; object.pFaces[i].vertexIndices[1]=tempB; object.pFaces[i].vertexIndices[2]=tempC; object.pFaces[i].material=indexMaterial; object.pFaces[i].smoothingGroup=indexSmoothing; } } |
valcoey@hotmail.com
Ramiro Alcocer, 2001
Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links